package com.puboot.common.util;

import java.math.BigDecimal;
import java.util.List;

/**
 * 钢铁企业
 * Created by chen on 2021/12/16.
 */
public class SteelUtil {

    /**
     * 计算 温室气体排放总量，单位为t
     *
     * @param eBurn                燃料燃烧排放量，单位为t
     * @param eProcess             过程排放量，单位为t
     * @param ePurchaseElectric    购入的电力消费的排放量，单位为t
     * @param ePurchaseHeat        购入的热力消费的排放量，单位为t
     * @param rCarbonSequestration 企业固碳产品隐含的排放量，单位为t
     * @param eOutputElectric      输出的电力排放量，单位为t
     * @param eOutputHeat          输出的热力排放量，单位为t
     * @return
     */
    public static Double getE(Double eBurn, Double eProcess, Double ePurchaseElectric,
                              Double ePurchaseHeat, Double rCarbonSequestration, Double eOutputElectric, Double eOutputHeat) {
        BigDecimal rCarbonSequestrationB = new BigDecimal(rCarbonSequestration);
        BigDecimal eOutputElectricB = new BigDecimal(eOutputElectric);
        BigDecimal eOutputHeatB = new BigDecimal(eOutputHeat);
        BigDecimal jsgc1 = GasDCUtil.allAdd(eBurn, eProcess, ePurchaseElectric, ePurchaseHeat);
        BigDecimal jsgc2 = jsgc1.subtract(rCarbonSequestrationB);
        BigDecimal jsgc3 = jsgc2.subtract(eOutputElectricB);
        BigDecimal jsgc4 = jsgc3.subtract(eOutputHeatB);
        return jsgc4.doubleValue();
    }

    /**
     * 计算 燃料燃烧排放量
     *
     * @param ncvs 第i种化石燃料的平均低位发热量，对固体和液体燃料以GJ/t为单位，对气体燃料以GJ /104Nm3为单位
     * @param fcs  第i种化石燃料的净消耗量，对固体和液体燃料以t为单位，对气体燃料以104Nm3为单位
     * @param ccs  第i种化石燃料的单位热值含碳量，单位为t/GJ
     * @param ofs  第i种化石燃料的碳氧化率，单位为%
     * @return
     */
    public static Double getEBurn(List<String> ncvs, List<String> fcs, List<String> ccs, List<String> ofs) {
        BigDecimal result = new BigDecimal(0.0);
        BigDecimal cl2B = new BigDecimal(12);
        for (int i = 0; i < ncvs.size(); i++) {
            BigDecimal jsgc1 = GasDCUtil.allMul(Double.valueOf(ncvs.get(i)), Double.valueOf(fcs.get(i)),
                    Double.valueOf(ccs.get(i)), Double.valueOf(ofs.get(i)), 44.0);
            result = result.add(jsgc1.divide(cl2B, 10, BigDecimal.ROUND_HALF_UP));
        }
        return result.doubleValue();
    }

    /**
     * 计算 过程排放量，单位为t
     *
     * @param pis          第i种熔剂的消耗量，单位为t
     * @param dxis         第i种熔剂的平均纯度，单位为%
     * @param efiSolvents  第i种熔剂的二氧化碳排放因子
     * @param pElectrode   电炉炼钢及精炼炉等消耗的电极量，单位为t
     * @param efElectrode  电炉炼钢及精炼炉等消耗电极的二氧化碳排放因子
     * @param mis          第i种含碳原料的购入量，单位为t
     * @param efiPurchases 第i种购入含碳原料的二氧化碳排放因子
     * @return
     */
    public static Double getEProcess(List<String> pis, List<String> dxis, List<String> efiSolvents,
                                     Double pElectrode, Double efElectrode,
                                     List<String> mis, List<String> efiPurchases) {
        BigDecimal result = new BigDecimal(0.0);
        for (int i = 0; i < pis.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(pis.get(i)), Double.valueOf(dxis.get(i)), Double.valueOf(efiSolvents.get(i)));
            result = result.add(jsgc);
        }
        BigDecimal pElectrodeB = new BigDecimal(pElectrode);
        BigDecimal efElectrodeB = new BigDecimal(efElectrode);
        BigDecimal jsgc1 = pElectrodeB.multiply(efElectrodeB);
        result = result.add(jsgc1);
        for (int i = 0; i < mis.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(mis.get(i)), Double.valueOf(efiPurchases.get(i)));
            result = result.add(jsgc);
        }
        return result.doubleValue();
    }

    /**
     * 计算 购入的电力消费的排放量，单位为t
     *
     * @param adPurchaseElectric 年度内的购入电量，单位为MWh
     * @param efPurchaseElectric 区域电网年平均供电因子，单位为t/MWh
     * @return
     */
    public static Double getEPurchaseElectric(Double adPurchaseElectric, Double efPurchaseElectric) {
        return GasDCUtil.allMul(adPurchaseElectric, efPurchaseElectric).doubleValue();
    }

    /**
     * 计算 购入的热力消费的排放量，单位为t 或者 输出的热力排放量，单位为t
     *
     * @param adPurchaseHeatOrAdOutInputHeat 年度内的外购热力，单位为GJ    年度内的输出热力，单位为GJ
     * @return
     */
    public static Double getEPurchaseHeatOrEOutputHeat(Double adPurchaseHeatOrAdOutInputHeat) {
        return GasDCUtil.allMul(0.11, adPurchaseHeatOrAdOutInputHeat).doubleValue();
    }

    /**
     * 计算 企业固碳产品隐含的排放量，单位为t
     *
     * @param adCarbonSequestrations 第i种固碳产品的产量，单位为t
     * @param efCarbonSequestrations 第i种固碳产品的二氧化碳排放因子
     * @return
     */
    public static Double getRCarbonSequestration(List<String> adCarbonSequestrations, List<String> efCarbonSequestrations) {
        BigDecimal result = new BigDecimal(0.0);
        for (int i = 0; i < adCarbonSequestrations.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(adCarbonSequestrations.get(i)), Double.valueOf(efCarbonSequestrations.get(i)));
            result = result.add(jsgc);
        }
        return result.doubleValue();
    }

    /**
     * 计算 输出的电力排放量，单位为t
     *
     * @param adOutInputElectric 年度内的输出电量，单位为MWh
     * @param efOutInputElectric 区域电网年平均供电因子，单位为t/MWh
     * @return
     */
    public static Double getEOutputElectric(Double adOutInputElectric, Double efOutInputElectric) {
        return GasDCUtil.allMul(adOutInputElectric, efOutInputElectric).doubleValue();
    }
}
